package com.hliushi.response;

/**
 * @ClassName JsonResult
 * @Description 定义统一的json结构
 * @Author liushi
 * @Date 2020/9/14 20:08
 * @Version V1.0
 **/
public class JsonResult<T> implements Response {

    /**
     * 由于Jackson封装的json数据类型不确定,所有在定义统一的json结构是,我们需要用到泛型
     * 统一的json结构中属性包括数据,状态码,提示信息即可构造方法可以根据实际业务需求做响应的添加即可,
     * 一般来说,应该有默认的返回结构,也应该有用户指定的返回结构
     */

    private T data;


    //操作是否成功
    boolean success = SUCCESS;

    //操作代码
    int code = SUCCESS_CODE;

    //提示信息
    String message;


    /**
     * 若没有数据返回,默认状态码为0,提示信息为:操作成功!
     */
    public JsonResult() {
        // this.code = 10000;
        this.message = "操作成功!";
    }

    /**
     * 若没有数据返回,可以人为指定状态码和提示信息
     *
     * @param code    状态码
     * @param message 提示信息
     */
    public JsonResult(int code, String message) {
        this.code = code;
        this.message = message;
    }

    /**
     * 有数据返回时,状态码为0,默认提示信息为:操作成功!
     *
     * @param data 数据类型
     */
   /* public JsonResult(T data) {
        this.data = data;
        this.message = "操作成功!";
    }*/

    /**
     * 有数据返回时,状态码为0,可以人为指定状态码和提示信息
     *
     * @param data 数据类型
     */
    public JsonResult(T data, String message) {
        this.data = data;
        this.message = message;
    }

    public JsonResult(T data, ResultCode resultCode) {
        this.data = data;
        this.success = resultCode.success();
        this.code = resultCode.code();
        this.message = resultCode.message();
    }

    public JsonResult(ResultCode resultCode) {
        this.success = resultCode.success();
        this.code = resultCode.code();
        this.message = resultCode.message();
    }

    public static JsonResult SUCCESS() {
        return new JsonResult(CommonCode.SUCCESS);
    }

    public static JsonResult FAIL() {
        return new JsonResult(CommonCode.FAIL);
    }


    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public boolean isSuccess() {
        return success;
    }

    public void setSuccess(boolean success) {
        this.success = success;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    @Override
    public String toString() {
        return "JsonResult{" +
                "data=" + data +
                ", success=" + success +
                ", code=" + code +
                ", message='" + message + '\'' +
                '}';
    }
}
